package entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.persistence.*;
import valueObject.FormularioVO;
import valueObject.PuntoDeEncuentroVO;
import valueObject.TipoDeContratacionVO;
import valueObject.UsuarioRegistradoVO;

@Entity
@NamedQueries({
    @NamedQuery(name="formularioActivo",query="SELECT f FROM Formulario f WHERE :hoy BETWEEN f.fechaInicio AND f.fechaFinal")
})
@Table(name="FORMULARIO")
public class Formulario implements Serializable, Entidad<FormularioVO> {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE)
    private int id;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Calendar fechaInicio;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Calendar fechaFinal;
    private boolean tieneAcompanante;
    private int cantidadDeAcompanante;
    private String contenidoExtra;
    
    @OneToMany(cascade= CascadeType.ALL)
    private List<PuntoDeEncuentro> puntosDeEncuentro;
    
    @ManyToOne(cascade= CascadeType.ALL)
    private Actividad actividad;
    
    
    @ManyToMany(cascade= CascadeType.ALL)
    private List<TipoDeContratacion> tiposDeContratacion;
    
    @OneToMany(mappedBy = "formulario",cascade= CascadeType.ALL)
    private List<UsuarioRegistrado> usuariosRegistrados;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Calendar getFechaInicio() {
        return fechaInicio;
    }

    public void setFechaInicio(Calendar fechaInicio) {
        this.fechaInicio = fechaInicio;
    }

    public Calendar getFechaFinal() {
        return fechaFinal;
    }

    public void setFechaFinal(Calendar fechaFinal) {
        this.fechaFinal = fechaFinal;
    }

    public boolean isTieneAcompanante() {
        return tieneAcompanante;
    }

    public void setTieneAcompanante(boolean tieneAcompanante) {
        this.tieneAcompanante = tieneAcompanante;
    }

    public int getCantidadDeAcompanante() {
        return cantidadDeAcompanante;
    }

    public void setCantidadDeAcompanante(int cantidadDeAcompanante) {
        this.cantidadDeAcompanante = cantidadDeAcompanante;
    }

    public String getContenidoExtra() {
        return contenidoExtra;
    }

    public void setContenidoExtra(String contenidoExtra) {
        this.contenidoExtra = contenidoExtra;
    }

    public List<PuntoDeEncuentro> getPuntosDeEncuentro() {
        return puntosDeEncuentro;
    }

    public void setPuntosDeEncuentro(List<PuntoDeEncuentro> puntosDeEncuentro) {
        this.puntosDeEncuentro = puntosDeEncuentro;
    }

    public Actividad getActividad() {
        return actividad;
    }

    public void setActividad(Actividad actividad) {
        this.actividad = actividad;
    }

    public List<TipoDeContratacion> getTipoDeContratacion() {
        return tiposDeContratacion;
    }

    public void setTipoDeContratacion(List<TipoDeContratacion> tipoDeContratacion) {
        this.tiposDeContratacion = tipoDeContratacion;
    }

    public List<UsuarioRegistrado> getUsuariosRegistrados() {
        return usuariosRegistrados;
    }

    public void setUsuariosRegistrados(List<UsuarioRegistrado> usuariosRegistrados) {
        this.usuariosRegistrados = usuariosRegistrados;
    }

    @Override
    public FormularioVO toValueObject() {
        FormularioVO formularioVO = new FormularioVO();
        formularioVO.setActividad(actividad.toValueObject());
        formularioVO.setCantidadDeAcompanante(cantidadDeAcompanante);
        formularioVO.setContenidoExtra(contenidoExtra);
        formularioVO.setFechaFinal(fechaFinal);
        formularioVO.setFechaInicio(fechaInicio);
        formularioVO.setId(id);
        
        if (puntosDeEncuentro != null) {
            ArrayList<PuntoDeEncuentroVO> puntosDeEncuentroVO = new ArrayList<PuntoDeEncuentroVO>();
            for(PuntoDeEncuentro puntoDeEncuentro : puntosDeEncuentro){
                puntosDeEncuentroVO.add(puntoDeEncuentro.toValueObject());
            }
            formularioVO.setPuntosDeEncuentro(puntosDeEncuentroVO);
        } else {
            formularioVO.setPuntosDeEncuentro(new ArrayList<PuntoDeEncuentroVO>());
        }
        
        formularioVO.setTieneAcompanante(tieneAcompanante);
        
        if (tiposDeContratacion != null) {
            ArrayList<TipoDeContratacionVO> tiposDeContratacionVO = new ArrayList<TipoDeContratacionVO>();
            for(TipoDeContratacion tipoDeContratacion : tiposDeContratacion){
                tiposDeContratacionVO.add(tipoDeContratacion.toValueObject());
            }
            formularioVO.setTipoDeContratacion(tiposDeContratacionVO);
        } else {
            formularioVO.setTipoDeContratacion(new ArrayList<TipoDeContratacionVO>());
        }
        
//        if(usuariosRegistrados != null){
//            ArrayList<UsuarioRegistradoVO> usuariosRegistradoVO = new ArrayList<UsuarioRegistradoVO>();
//            for(UsuarioRegistrado usuarioRegistrado : usuariosRegistrados){
//                usuariosRegistradoVO.add(usuarioRegistrado.toValueObject());
//            }
//            formularioVO.setUsuariosRegistrados(usuariosRegistradoVO);
//        }else{
            formularioVO.setUsuariosRegistrados(new ArrayList<UsuarioRegistradoVO>());
//        }
        
        return formularioVO;
        
    }
    
}
